package com.xiaofeng.oss.config;

import com.xiaofeng.oss.adapter.StorageAdapter;
import com.xiaofeng.oss.adapter.AliStorageAdapter;
import com.xiaofeng.oss.adapter.MinioStorageAdapter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Created with IntelliJ IDEA
 *
 * @Author: chc
 * @Date: 2024/02/02/14:53
 * @Description: 适配器模式
 */
@Configuration
@RefreshScope
public class StorageConfig {

    @Value("${storage.service.type}")
    private String storageType;

    /**
     * RefreshScope
     * 1.单独管理Bean生命周期
     * 创建Bean的时候如果是RefreshScope就缓存在一个专门管理的ScopeMap中，这样就可以管理Scope是Refresh的Bean的生命周期了（所以含RefreshScope的其实一共创建了两个bean）。
     * 2.重新创建Bean
     * 外部化配置刷新之后，会触发一个动作，这个动作将上面的ScopeMap中的Bean清空，这样这些Bean就会重新被IOC容器创建一次，使用最新的外部化配置的值注入类中，达到热加载新值的效果。
     */
    @Bean
    @RefreshScope
    public StorageAdapter storageService(){
        if ("minio".equals(storageType)){
            return new MinioStorageAdapter();
        }else if ("aliyun".equals(storageType)){
            return new AliStorageAdapter();
        }else {
            throw new IllegalArgumentException("未找到对应的文件存储处理器");
        }
    }
}
